// app.js
const config = require('./config.js');

App({
  globalData: {
    userInfo: null,
    token: null,
    baseUrl: config.baseUrl, // 使用配置文件中的baseUrl
    locationInterval: null,
    currentLocation: null,
    env: config.getCurrentEnv() // 使用配置中的环境检测
  },

  onLaunch() {
    console.log('小程序启动');
    // 检查登录状态
    this.checkLoginStatus();
  },

  onShow() {
    console.log('小程序显示');
  },

  onHide() {
    console.log('小程序隐藏');
    // 停止位置跟踪
    this.stopLocationTracking();
  },

  // 检查登录状态
  checkLoginStatus() {
    const token = wx.getStorageSync('token');
    const userInfo = wx.getStorageSync('userInfo');
    
    if (token && userInfo) {
      this.globalData.token = token;
      this.globalData.userInfo = userInfo;
      
      // 验证token是否有效
      this.verifyToken();
    } else {
      console.log('未找到登录信息');
    }
  },

  // 验证token
  verifyToken() {
    wx.request({
      url: this.globalData.baseUrl + '/api/auth/verify',
      method: 'GET',
      header: {
        'Authorization': 'Bearer ' + this.globalData.token
      },
      success: (res) => {
        if (res.data.success) {
          console.log('Token验证成功');
          // 更新用户信息
          this.globalData.userInfo = res.data.user;
          wx.setStorageSync('userInfo', res.data.user);
          // 开始位置跟踪
          this.startLocationTracking();
        } else {
          console.log('Token验证失败:', res.data.message);
          this.clearLoginInfo();
        }
      },
      fail: (err) => {
        console.error('Token验证请求失败:', err);
        this.clearLoginInfo();
      }
    });
  },

  // 清除登录信息
  clearLoginInfo() {
    console.log('清除登录信息');
    wx.removeStorageSync('token');
    wx.removeStorageSync('userInfo');
    this.globalData.token = null;
    this.globalData.userInfo = null;
    // 停止位置跟踪
    this.stopLocationTracking();
  },

  // 开始位置跟踪
  startLocationTracking() {
    if (this.globalData.locationInterval) {
      return; // 已经在跟踪中
    }

    console.log('开始位置跟踪');
    
    // 立即获取一次位置
    this.getCurrentLocation();
    
    // 每30秒更新一次位置
    this.globalData.locationInterval = setInterval(() => {
      this.getCurrentLocation();
    }, 30000);
  },

  // 停止位置跟踪
  stopLocationTracking() {
    if (this.globalData.locationInterval) {
      clearInterval(this.globalData.locationInterval);
      this.globalData.locationInterval = null;
      console.log('停止位置跟踪');
    }
  },

  // 获取当前位置
  getCurrentLocation() {
    // 先检查位置权限
    wx.getSetting({
      success: (res) => {
        if (res.authSetting['scope.userLocation'] === false) {
          // 用户拒绝了位置权限，引导用户开启
          wx.showModal({
            title: '需要位置权限',
            content: '为了提供更好的服务，需要获取您的位置信息。请在设置中开启位置权限。',
            confirmText: '去设置',
            success: (modalRes) => {
              if (modalRes.confirm) {
                wx.openSetting({
                  success: (settingRes) => {
                    if (settingRes.authSetting['scope.userLocation']) {
                      // 用户开启了权限，重新获取位置
                      this.getCurrentLocation();
                    }
                  }
                });
              }
            }
          });
          return;
        }
        
        // 有权限或未设置，尝试获取位置
        wx.getLocation({
          type: 'gcj02',
          isHighAccuracy: true,
          highAccuracyExpireTime: 3000,
          success: (res) => {
            const location = {
              latitude: res.latitude,
              longitude: res.longitude,
              timestamp: new Date().getTime(),
              accuracy: res.accuracy || 0
            };
            
            this.globalData.currentLocation = location;
            console.log('获取位置成功:', location);
            
            // 如果有当前任务，更新位置到服务器
            this.updateLocationToServer(location);
          },
          fail: (err) => {
            console.error('获取位置失败:', err);
            
            // 根据错误类型给出不同的提示
            let errorMsg = '获取位置失败';
            if (err.errMsg.includes('auth deny')) {
              errorMsg = '位置权限被拒绝，请在设置中开启';
            } else if (err.errMsg.includes('timeout')) {
              errorMsg = '获取位置超时，请检查GPS是否开启';
            } else if (err.errMsg.includes('network')) {
              errorMsg = '网络错误，请检查网络连接';
            }
            
            // 只在开发环境显示错误提示
            if (this.globalData.env === 'development') {
              wx.showToast({
                title: errorMsg,
                icon: 'none',
                duration: 2000
              });
            }
          }
        });
      },
      fail: (err) => {
        console.error('获取设置失败:', err);
      }
    });
  },

  // 更新位置到服务器
  updateLocationToServer(location) {
    // 这里可以添加逻辑来更新位置到服务器
    // 如果有当前任务，调用相应的API
    console.log('位置信息:', location);
  },

  // 通用请求方法
  request(options) {
    return new Promise((resolve, reject) => {
      const token = wx.getStorageSync('token');
      
      const requestOptions = {
        url: this.globalData.baseUrl + options.url,
        method: options.method || 'GET',
        data: options.data || {},
        header: {
          'Content-Type': 'application/json',
          ...options.header
        },
        success: (res) => {
          console.log('请求成功:', options.url, res.data);
          
          if (res.statusCode === 401) {
            // token过期，跳转登录
            console.log('Token过期，跳转登录页');
            this.clearLoginInfo();
            wx.redirectTo({
              url: '/pages/login/login'
            });
            reject(new Error('认证失败'));
          } else if (res.statusCode >= 200 && res.statusCode < 300) {
            resolve(res);
          } else {
            console.error('请求失败:', res);
            reject(new Error(res.data?.message || '请求失败'));
          }
        },
        fail: (err) => {
          console.error('网络请求失败:', err);
          reject(err);
        }
      };

      // 添加认证头
      if (token) {
        requestOptions.header.Authorization = 'Bearer ' + token;
      }

      console.log('发送请求:', requestOptions);
      wx.request(requestOptions);
    });
  },

  // 显示加载提示
  showLoading(title = '加载中...') {
    wx.showLoading({
      title: title,
      mask: true
    });
  },

  // 隐藏加载提示
  hideLoading() {
    wx.hideLoading();
  },

  // 显示成功提示
  showSuccess(title, duration = 1500) {
    wx.showToast({
      title: title,
      icon: 'success',
      duration: duration
    });
  },

  // 显示错误提示
  showError(title, duration = 2000) {
    wx.showToast({
      title: title,
      icon: 'none',
      duration: duration
    });
  },

  // 显示确认对话框
  showConfirm(title, content) {
    return new Promise((resolve) => {
      wx.showModal({
        title: title,
        content: content,
        success: (res) => {
          resolve(res.confirm);
        }
      });
    });
  }
}); 